還記得我們昨天說的執行環境分為創建和執行兩個階段嗎?創建階段時的記憶體內有基本的全域變數、this 以及外部環境,而當程式碼被解析器解析的時候,他會知道你宣告的變數和 function 在哪裡,從而把他們加入記憶體中,佔據一個空位。加入記憶體的動作就叫做 Hoisting(提升)。
因為變數與 function 已經在記憶體中了,所以當程式碼在執行階段的時候就可以找到他們。
Hoisting 一個有趣的特性,他可以使變數和 function 的宣告看起來移到程式的最上面。說是看起來,實際上是因為程式碼還在原本的位置上。
變數的 Hoisting 僅有宣告的部分,值並不會跟著 Hoisting。
console.log(a); // undefined
var a = '鯊魚';
function 的 Hoisting,可以先呼叫 function,接著才在下面繼續設計你的 function,不用事後搬來搬去。
shark(); // aaaaaaaaaa
function shark(){
console.log('aaaaaaaaaa');
}
還記得 function 陳述式和表達式嗎? 介紹
當 function 使用表達式的時候,只會顯示 is not defined
喔。因為變數先 Hoisting 後直接執行 shark()
,出現錯誤後程式碼會直接停止不往下運行,所以並沒有執行到賦予變數 function 的步驟。
shark();
var shark = function(){
console.log('aaaaaaaaaa');
}
知道 Hoisting 後,你可能會想說既然 function 會 Hoisting 了,那2個 function 同時呼叫的話呢?會有先後順序嗎?
function a(){
b();
}
function b(){
a();
}
b();
不會喔~ 兩個會同時執行喔!b 呼叫 a,a 呼叫 b...無限重複。
以上就是基礎介紹了,假如你想了解更多關於 Hoisting 可以參考這篇文章 我知道你懂 hoisting,可是你了解到多深?
又是還沒想好明天要幹嘛的一天,也許看看清單有什麼好寫的吧~